package com.woniuxy.courseservice.service.impl;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.core.status.CourseTypeStateEnum;
import com.woniuxy.core.util.PageInfo;
import com.woniuxy.coursedao.mapper.CourseTypeMapper;
import com.woniuxy.coursedao.model.CourseType;
import com.woniuxy.coursemodel.param.*;
import com.woniuxy.courseservice.service.CourseTypeService;
import com.woniuxy.courseservice.service.exception.CourseTypeException;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 冉杰
 * @since 2024-01-15
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements CourseTypeService {

    /**
     *
     * @param param 新增类型的类型名
     */
    @Override
    public void add(AddCourseTypeParam param) {
        CourseType one = getOne(new LambdaQueryWrapper<CourseType>().eq(CourseType::getCourseTypeName, param.getCourseTypeName()));
        if (!BeanUtil.isEmpty(one)) throw new CourseTypeException(6001,"该课程类型已存在");
        CourseType courseType = BeanUtil.toBean(param, CourseType.class);
        courseType.setCourseTypeState(CourseTypeStateEnum.TYPE_ENABLE.getCode());
        courseType.setVenueId(param.getVenueId());
        save(courseType);
    }

    /**
     *
     * @param param 修改类型的参数列表
     */
    @Override
    public void modify(ModifyCourseTypeParam param) {
        CourseType courseType = getById(param.getCourseTypeId());
        if (BeanUtil.isEmpty(courseType)) throw new CourseTypeException(6002,"课程类型不存在");
        CourseType one = getOne(new LambdaQueryWrapper<CourseType>().eq(CourseType::getCourseTypeName, param.getCourseTypeName()));
        if (one.getVenueId().intValue()!=param.getVenueId().intValue()) throw new CourseTypeException(6005,"只能对自己场馆的课程类型进行修改");
        if (!BeanUtil.isEmpty(one)) throw new CourseTypeException(6001,"该课程类型已存在");
        courseType.setCourseTypeName(param.getCourseTypeName());
        updateById(courseType);
    }

    /**
     *
     * @param param 修改类型状态的参数列表
     */
    @Override
    public void changeState(ChangeStateParam param) {
        CourseType courseType = getById(param.getCourseTypeId());
        if (courseType.getVenueId().intValue()!=param.getVenueId().intValue()) throw new CourseTypeException(6007,"只能对自己场馆的课程类型进行状态修改");
        if (BeanUtil.isEmpty(courseType)) throw new CourseTypeException(6002,"课程类型不存在");
        courseType.setCourseTypeState(param.getCourseTypeState());
        updateById(courseType);
    }

    @Override
    public PageInfo<CourseType> byPage(CourserTypeByPageParam param) {
        LambdaQueryWrapper<CourseType> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(!ObjectUtil.isEmpty(param.getCourseTypeName()),CourseType::getCourseTypeName,param.getCourseTypeName())
                .eq(!ObjectUtil.isEmpty(param.getCourseTypeState()),CourseType::getCourseTypeState,param.getCourseTypeState())
                .eq(CourseType::getVenueId,param.getVenueId());
        Page<CourseType> page = new Page<>(param.getPageNum(),param.getPageSize());
        page(page,wrapper);
        PageInfo<CourseType> pageInfo = BeanUtil.toBean(page, PageInfo.class);
        pageInfo.setPages(page.getPages());
        pageInfo.setList(page.getRecords());
        return pageInfo;
    }

    @Override
    public CourseType byId(Integer courseTypeId) {
        CourseType courseType = getById(courseTypeId);
        if (BeanUtil.isEmpty(courseType)) throw new CourseTypeException(6002,"课程类型不存在");
        return courseType;
    }
}
